package com.gitee.techstack;

import com.gitee.techstack.entity.Book;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * ┏┓　　　┏┓
 * ┏┛┻━━━┛┻┓
 * ┃　　　　　　　┃
 * ┃　　　━　　　┃
 * ┃　┳┛　┗┳　┃
 * ┃　　　　　　　┃
 * ┃　　　┻　　　┃
 * ┃　　　　　　　┃
 * ┗━┓　　　┏━┛
 * 　　┃　　　┃神兽保佑
 * 　　┃　　　┃代码无BUG！
 * 　　┃　　　┗━━━┓
 * 　　┃　　　　　　　┣┓
 * 　　┃　　　　　　　┏┛
 * 　　┗┓┓┏━┳┓┏┛
 * 　　　┃┫┫　┃┫┫
 * 　　　┗┻┛　┗┻┛
 *
 * @author peter_RD_nj
 * @description
 * @create 2019/12/4 下午8:51
 **/
public class ReflectClass {

    /**
     * 反射实例化
     */
    public static void reflectNewInstance() {
        Class<?> classBook = null;
        try {
            classBook = Class.forName("com.gitee.techstack.entity.Book");
            // 无参数构造方法
            Object object = classBook.newInstance();
            Book book = (Book) object;
            book.setName("Hello booName");
            book.setAuthor("bookAuth");
            System.out.println(book.toString());
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        }
    }

    /**
     * 反射私有的构造方法
     */
    public static void reflectPrivateConstructor() {
        try {
            Class<?> classBook = Class.forName("com.gitee.techstack.entity.Book");

            Constructor<?> declaredConstructor = classBook.getDeclaredConstructor(String.class, String.class);
            declaredConstructor.setAccessible(true);
            Object object = declaredConstructor.newInstance("Hello booName", "bookAuth");
            Book book = (Book) object;
            System.out.println(book.toString());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取私有的属性
     */
    public static void reflectPrivateField() {
        try {
            Class<?> classBook = Class.forName("com.gitee.techstack.entity.Book");
            Object obj = classBook.newInstance();
            Field field = classBook.getDeclaredField("TAG");
            field.setAccessible(true);
            String value = (String) field.get(obj);
            System.out.println(value);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 私有方法
     */
    public static void reflectPrivateMethod() {
        try {
            Class<?> classBook = Class.forName("com.gitee.techstack.entity.Book");
            Object obj = classBook.newInstance();

            Method declaredMethod = classBook.getDeclaredMethod("declaredMethod", int.class);
            declaredMethod.setAccessible(true);

            String invokeValue = (String) declaredMethod.invoke(obj, 1);

            System.out.println(invokeValue);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    public static void main(String[] args) {
        reflectPrivateMethod();
//        reflectPrivateField();
//        reflectNewInstance();
//        reflectPrivateConstructor();
    }

}
